﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace logic
{
    public class Tombolone
    {
        private int num, win;
        private Generator generatore;
        private bool[] tavola = new bool[90];

        public Tombolone(Generator generatore)
        {
            this.generatore = generatore;       //  Assegnamento del generatore di numeri casuali

            for (int i = 0; i < 90; i++)        //  Inizializzazione dell'array
                tavola[i] = false;              //
        }   // Costruttore

        private int valueWin(bool[] tavola, int num)
        {
            int ris, count = 0;
            int row, area, right;
            bool flag = true;

            row = num / 10;                 // Riga del numero
            area = row / 3;                 // Area del numero

            if (num % 10 < 5) right = 0;     // Posizione del numero
            else right = 1;                 //

            for (int i = beginRow(row, right), max = beginRow(row, right) + 5; i < max; i++)        //  Conta i numeri estratti sulla riga del numero estratto
                if (tavola[i]) count++;                                                             //

            ris = count;

            if (count < 5) return ris;

            count = 0;
            for (int i = beginArea(area, right), max = beginArea(area + 1, 0); flag && i < max; i += 5)     //
            {                                                                                               //  Controlla se la vincita è "tombola"
                for (int rmax = beginRow(i / 10, right)+5; i < rmax; i++)                                   //
                    if (!tavola[i])                                                                         //
                    {                                                                                       //
                        flag = false;                                                                       //
                        break;                                                                              //
                    }                                                                                       //
            }                                                                                               //

            if (flag) ris = 6;          // Se il risultato è "tombola" restituisce 6

            return ris;
        }   // Restituisce il livello di vincita. Da 1 a 5 i numeri estratti per riga. Restituisce 6 per "tombola"

        private int beginRow(int row, int right)
        {
            return (row * 10 + right * 5);
        }       // Restituisce il primo elemento della riga del numero

        private int beginArea(int area, int right)
        {
            return (area * 30 + right * 5);
        }     // Restituisce il primo elemento dell'area del numero

        public void estrai()
        {
            num = generatore.getNumber(this.tavola);
            tavola[num] = true;
            win = valueWin(this.tavola, this.num);
        }   // Estrae il numero e calcola la vincita

        public int getNumber()
        {
            return this.num;
        }   // Metodo getter this.num

        public int getWin()
        {
            return this.win;
        }   // Metodo getter this.win

        public bool[] getTavola()
        {
            return this.tavola;
        }   // Metodo getter this.tavola

    }
}
